#include <GL/glut.h>
#include <math.h>

//矩阵转换为图片
//real:实部权值，image:虚部权值，R、G、B:颜色分量系数，stand=1:规范最大值为255
void CP_m2i(double *mat , GLubyte *img , int w , int h , int L , float real , float image , float R , float G , float B , int stand)
{
	int i,j , s=L/h , cell;
	for(i=0 ; i<h ; i++){
		for(j=0 ; j<w ; j++)
		{
			cell = (int)sqrt((*(mat+i*w*2+j*2+0))*(*(mat+i*w*2+j*2+0))*real*real+
				(*(mat+i*w*2+j*2+1))*(*(mat+i*w*2+j*2+1))*image*image);
			if(stand){ //对超过255的值规范化为255
				if(cell <= 255){
					(*(img+i*s+j*3+0)) += cell * B;
					(*(img+i*s+j*3+1)) += cell * G;
					(*(img+i*s+j*3+2)) += cell * R;
				}
				else{
					*(img+i*s+j*3+0) = 255 * B;
					*(img+i*s+j*3+1) = 255 * G;
					*(img+i*s+j*3+2) = 255 * R;
				}
			}
			else{ //直接赋值，不规范化
				*(img+i*s+j*3+0) += cell * B;
				*(img+i*s+j*3+1) += cell * G;
				*(img+i*s+j*3+2) += cell * R;
			}
		}
	}
}
//图片转换为矩阵
//real:实部权值，image:虚部权值，R、G、B:颜色分量系数
void CP_i2m(GLubyte *img , double *mat , int w , int h , int L , float R , float G , float B , float real , float image)
{
	int i,j,s=L/h , cell;
	for(i=0 ; i<h ; i++){
		for(j=0 ; j<w ; j++){
			cell =(*(img+i*s+j*3+0)) * B + (*(img+i*s+j*3+1)) * G + (*(img+i*s+j*3+2)) * R;
				//(*(img+i*s+j*3+0))*0.144*B + (*(img+i*s+j*3+1))*0.587*G + (*(img+i*s+j*3+2))*0.299*R;
				//sqrt((double)(((*(img+i*s+j*3+0))*(*(img+i*s+j*3+0))*B*B+(*(img+i*s+j*3+1))*(*(img+i*s+j*3+1))*G*G+(*(img+i*s+j*3+2))*(*(img+i*s+j*3+2))*R*R)/3));
			*(mat+i*w*2+j*2+0) = cell * real;
			*(mat+i*w*2+j*2+1) = cell * image;
		}
	}
}
//像素矩阵元初始/赋值为R、G、B
void init_Pix(GLubyte *img , int w , int h , int L , int R , int G , int B)
{
	int i,j,s=L/h;
	for(i=0 ; i<h ; i++){
		for(j=0 ; j<w ; j++){
			(*(img+i*s+j*3+0)) = B;
			(*(img+i*s+j*3+1)) = G;
			(*(img+i*s+j*3+2)) = R;
		}
	}
}
//像素矩阵元比例缩放，系数为R、G、B
void trans_Pix(GLubyte *img , int w , int h , int L , int R , int G , int B)
{
	int i,j,s=L/h;
	for(i=0 ; i<h ; i++){
		for(j=0 ; j<w ; j++){
			(*(img+i*s+j*3+0)) *= B;
			(*(img+i*s+j*3+1)) *= G;
			(*(img+i*s+j*3+2)) *= R;
		}
	}
}
